package cn.tedu.springbootdemo;

import cn.tedu.springbootdemo.Impl.UserServiceImpl;
import cn.tedu.springbootdemo.dao.UserDao;
import cn.tedu.springbootdemo.entity.User;
import cn.tedu.springbootdemo.exception.UserNotFoundException;
import cn.tedu.springbootdemo.service.UserService;
import java.util.Arrays;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import static org.junit.jupiter.api.Assertions.*;

/**
 * 使用模拟框架进行单元测试
 * 脱离数据库且不依赖于Spring环境，不使用Spring的数据层
 */
public class JUnit5Test03 {

    UserDao userDao;

    UserService userService;

    @BeforeEach
    void init(){
        userDao= Mockito.mock(UserDao.class);
        Mockito.when(userDao.findUserByName("Tom"))
            .thenReturn(new User(1,"Tom","123","Admin"));
        //创建业务层
        UserServiceImpl userService=new UserServiceImpl();
        //将数据层注入到业务层
        userService.setUserDao(userDao);
        this.userService=userService;
    }

    /**
     * 断言是一种除错机制，用于验证代码是否符合编码人员的预期。在程序运行期间，断定得到的数据/变量的值
     * ，必然是某个数值。如果是则通过检查，如果不是则抛出异常
     *
     * 使用断言的好处：
     * 1.验证测试结果的正确性
     * 2.提高代码的可读性
     * 3.提高测试效率
     *
     * 使用断言前先导入断言包：
     * import static org.junit.jupiter.api.Assertions.*;
     */
    @Test
    void login(){
        User user = userService.login("Tom", "123");
        System.out.println(user);
        //利用断言检查用户名是否为Tom，如果一致就继续运行，如果不一致就出现错误！
        assertEquals("Tom",user.getUsername());
        //UserNotFoundException 用户不存在
        //接下来断言来检查登录失败的情况
        assertThrows(UserNotFoundException.class,()->{
            userService.login("jerry",null);
        });
    }
    @Test
    void testAssert(){
        //测试两组数组的内容是否一致
        int[] arr1={1,2,3};
        int[] arr2={3,1,2};
        Arrays.sort(arr2);
        System.out.println(Arrays.toString(arr1));
        System.out.println(Arrays.toString(arr2));
        /*
            如果数组不相等，assertArrayEquals()方法将会抛出AssertionError，
            测试将会失败，并输出“数组不相等”的错误信息
         */
        assertArrayEquals(arr1,arr2,"数组不相等");

    }
}
